//+------------------------------------------------------------------+
//|                                          IEqualityComparable.mqh |
//|                             Copyright 2000-2025, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| IEqualityComparable<T> 泛型接口：相等性判断与哈希计算标准接口     |
//| 核心定位：为任意数据类型提供标准化的“相等性判断”和“哈希值计算”能力， |
//|           解决自定义类型（结构/类）默认比较逻辑不满足业务需求的问题，   |
//|           同时为哈希表等高效数据结构提供基础支持                     |
//| 泛型特性：通过模板参数 <T> 实现类型适配，确保比较操作的类型安全性，   |
//|           仅允许同类型对象间的比较（如 T=订单类型时，只能比较两个订单） |
//| 核心价值：作为“相等性契约”，统一“对象是否相等”的判断标准（如两个订单ID相同即视为相等），|
//|           并通过哈希值计算支持哈希表的快速查找、去重等操作，提升EA中数据处理效率 |
//+------------------------------------------------------------------+
template<typename T>
interface IEqualityComparable
  {
   //----------------------------------------------------------------
   // 相等性判断接口：定义对象“业务相等”的逻辑
   //----------------------------------------------------------------
   /**
    * @brief 判断当前对象与目标对象在业务逻辑上是否相等
    * @param value [in] 目标比较对象（类型必须与 T 一致）
    * @return bool - 相等性结果：true=业务上相等，false=不相等
    * @note 实现规范：
    *       1. 自反性：对象必须与自身相等（this->Equals(this) 必为 true）
    *       2. 对称性：若 a.Equals(b) 为 true，则 b.Equals(a) 必为 true
    *       3. 传递性：若 a.Equals(b) 和 b.Equals(c) 为 true，则 a.Equals(c) 必为 true
    *       4. 业务关联性：基于关键属性判断（如订单按 order_id 比较，忽略非关键属性）
    *       5. 空值处理：若 T 为指针类型，需判断 value 是否为 NULL（通常返回 false）
    */
   bool              Equals(T value);

   //----------------------------------------------------------------
   // 哈希值计算接口：生成对象的哈希标识，支持哈希表操作
   //----------------------------------------------------------------
   /**
    * @brief 计算当前对象的哈希值，用于哈希表等数据结构的快速索引
    * @return int - 32位哈希值（相同业务对象必须返回相同值）
    * @note 实现规范：
    *       1. 一致性：若 a.Equals(b) 为 true，则 a.HashCode() 必等于 b.HashCode()
    *       2. 分散性：不同对象尽量返回不同哈希值（减少哈希冲突，提升哈希表效率）
    *       3. 稳定性：对象关键属性未修改时，哈希值保持不变
    *       4. 高效性：计算逻辑需简洁（避免复杂运算影响性能）
    */
   int               HashCode(void);
  };
//+------------------------------------------------------------------+